let OSS = require('ali-oss');
let {ali_config}=require('../config/default')
const path=require('path')

/*
创建oss对象
 */
let getClient=()=>{
    return new OSS({
        // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
        region: ali_config.region,
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        accessKeyId: ali_config.accessKeyId,
        accessKeySecret: ali_config.accessKeySecret,
        bucket: ali_config.bucket
    })
}
const header= {
    'Cache-Control': 'no-cache',
    'Content-Type': 'image/jpg'
}
/*
创建文件夹
 */
let createFolder=async (client, name) => {
    //上传一个空文件模拟文件夹操作
    async function create() {
        try {
            // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
            // 如果本地文件的完整路径中未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
            // 创建模拟文件夹对象
            await client.put(`${name}/`, 'util\\particle.js').then((result) => {
                console.log(`创建文件夹 ${name} 成功!`)
            }).catch((e) => {
                console.log('创建失败 ' + e)
            });
        } catch (e) {
            console.log(e);
        }
    }

    await create();
}
/*
上传文件
 */
let upLoadFile= (client, name, url) => {
    return new Promise(async (resolve, reject) => {
        try {
            // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
            // 如果本地文件的完整路径中未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
            // 创建模拟文件夹对象
            let result = await client.put(name, url,{header})
            console.log(`上传文件 ${name} 成功!--${result}`)
            resolve(result)
        } catch (e) {
            console.log('上传失败 ' + e);
        }
    })
}
/*
删除文件
 */
let deleteFile=(client, name) => {
    return new Promise(async (resolve, reject) => {
        try {
            // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
            // 如果本地文件的完整路径中未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
            // 创建模拟文件夹对象
            let result = await client.delete(name)
            resolve(result)
        } catch (e) {
            reject(e);
        }
    })
}
/*
获取文件list
 */
let getFileList=async (client, folderName) => {
    async function list() {
        let result = await client.list({
            // 列举文件名中包含前缀foo/的文件。
            prefix: folderName,
            //分隔符
            delimiter: '/',
            //忽略第一个文件
            marker:folderName
        });
        return result.objects
    }
    return await list();
}
/*
获取bucket版本号
 */
let getFolderVer=async (client, prefix) => {
    async function getBucketVersioning() {
        // 获取存储空间版本控制状态信息。
        const versionListing = await client.getBucketVersions({
            'max-keys': 1,
            prefix
        });
        versionListing.objects.forEach(o => {
            console.log(`${o.name}, ${o.versionId}`)
        })
        return versionListing.objects[0].versionId
    }
    return await getBucketVersioning();
}
/*
拷贝文件(标签功能时用)
 */
let copyFile=async (client,target,origin) => {
    return new Promise(async (resolve, reject) =>{
        // 获取存储空间版本控制状态信息。
        try {
            let result = await client.copy(target,origin)
            resolve(result)
        } catch (e) {
            reject(e);
        }
    })
}
/*
加工图片
 */
let processImage=async (client,sourceImage,targetImage,processStr) => {
    return new Promise(async (resolve, reject) =>{
        // 获取存储空间版本控制状态信息。
        try {
            let result = await client.processObjectSave(
              sourceImage,
              targetImage,
              processStr,
              ali_config.bucket
            );
            resolve(result)
        } catch (e) {
            reject(e);
        }
    })
}
module.exports = {
    getClient,
    createFolder,
    upLoadFile,
    getFileList,
    deleteFile,
    getFolderVer,
    copyFile,
    processImage
}
